# """
#
# 多态的核心概念：
#
# """
#
# class Animal:   #创建了一个父类
#     def speak(self):
#         pass
# class Dog(Animal):
#     def speak(self):
#         print("汪汪汪")
#
# class Cat(Animal):
#     def speak(self):
#         print("喵喵喵")
#
# def make_sound(animal):   #animal可以任意的起名字
#     animal.speak()   # 只要在这个地方进行 调用就可以
#
# class make(Animal):
#     def speak(self):
#         print("hhhh")
#
#
#
#
# d = Dog()     #创建了一个变量来接收Dog的消息
# c = Cat()     #创建了一个变量来接收Cat的消息
# e = make()
#
# make_sound(d)     #输出
# make_sound(c)      #输出
# make_sound(e)








"""


魔法方法：在python中  _xxx_  这就是魔法方法   __init__

"""
import time
from os import times

# """
# str:打印对象时显示什么内容
# """
# class Person:
#     def __init__(self,name):  #传入了一个name的实例属性
#         self.name = name       #使用self去赋值一个name,让其他的类/方法可以找到它
#     def __str__(self):    #使用_str_的魔法方法来输出我们的内容
#         """
#
#         如果没有它。打印的是一个地址值
#         加了它之后，可以让我们自定义信息
#         :return:
#         """""
#
#         return self.name    #return    接收返回值
#
# p = Person("小明")    #向  Person  中传递参数让print输出
# print(p)
#


"""
_del_  对象被删除时自动的执行
"""
# # __del__
# import time
# class Foo:
#     def __init__(self,x,filepath,encoding='utf8'):
#         self.x=x # 属性
#         self.f=open(filepath,'rt',encoding=encoding)   #rt是读取
#
#     def __del__(self):
#         print('__del__正在运行')
#         self.f.close()   #close文件关闭的方法
# obj = Foo(1,'a.txt')     #创建对象
# print(obj.f.read()) # 后续代码没有的时候，说明这个资源没有再使用，则关闭
# time.sleep(3)
# print(obj.f.read())
# # print(obj.f.read())
# # print(obj.f.read())

#引入指针的概念














"""

_call_:让你的对象像函数一样被调用

你可以把 obj() 看成是一个遥控器上的按钮：
- 遥控器是你的对象（obj）
- 按钮就是 call 方法
- 按下按钮（obj()）就会触发某个动作（比如打印一句话）


思考：
1. 让对象具有函数行为
  - 比如你想让一个对象既能保存数据，又能像函数一样被调用。
2. 装饰器底层原理
  - 很多高级用法（比如装饰器、回调函数）背后都可能用到了 __call__。



"""

# class CallMe:   #定义了一个类
#     def __call__(self):     #使用__call__的魔法方法，当对象被调用时加（）自动触发
#         print("我被调用了")
#
# obj = CallMe()
# obj()    #使用（）自动的调用这个call的方法








"""

"""

# class Computer:
#     def run(self):
#         print("电脑在运行")
#
# class Teacher:
#     def __init__(self, name):
#         self.name = name
#         self.computer = Computer()  # 组合：老师有一个电脑
#
# t = Teacher("张老师")
# t.computer.run()  # 输出：电脑在运行



#
#
# # 定义一个 Phone 类，表示“手机”这个事物
# class Phone:
#     # 定义一个 call 方法，表示手机可以打电话
#     def call(self):
#         print("正在打电话")
#
#
# # 定义一个 Person 类，表示“人”
# class Person:
#     # 初始化方法，创建一个 Person 对象时自动调用
#     def __init__(self, name):
#         # 给对象设置一个属性 name，表示人的名字
#         self.name = name
#
#         # 给对象设置一个属性 phone，值是一个 Phone 对象
#         # 这就是组合：Person 对象有一个 Phone 对象
#         self.phone = Phone()
#
#
# # 创建一个 Person 对象，名字是 "小明"
# p = Person("小明")
#
# # 调用 p 对象中的 phone 属性的 call 方法
# # 也就是：让小明的手机打电话
# p.phone.call()  # 输出：正在打电话


"""
1. 代码复用：不用重复造轮子，直接使用已有类的功能。
2. 结构清晰：更真实地反映现实世界的关系。
3. 灵活扩展：可以随时更换组合的对象。

核心：
通过为某一个对象添加属性(属性的值是另外一个类的对象)的方式,可以间接地将两个类关联/整合/组合到一起
从而减少类与类之间代码冗余
"""
"""


class Animal:
    pass

class Dog(Animal):  # 狗是一个动物
    pass
"""



"""
class Engine:
    def start(self):
        print("引擎启动了")

class Car:
    def __init__(self):
        self.engine = Engine()  # 汽车有一个引擎
"""






